package FilesManagers;

import java.io.*;
import java.nio.channels.FileChannel;

/**
 * Clase manejadora de los archivos de entrada y configuración
 * 
 */

public class FileManager{

	private BufferedReader entrada;
	private InputStreamReader is;
	private FileInputStream miArchvo;
	private char marcadorComentario;
	private String archivo;

	/**
	 * Carga el archivo con el path pasado como string y utilizando la codificación pasada como parámetro
	 * Arroja excepción si no puede abrirlo o no existe
	 * 
	 * @param archivo
	 * @param codificacion
	 * @throws CantOpenFileException
	 */
	public void cargarArchivo(String archivo,String codificacion) throws CantOpenFileException{
				setArchivo(archivo);
				if (codificacion.compareTo("")==0) codificacion="UTF-8";
				
				try{
					miArchvo = new FileInputStream(archivo);
					is = new InputStreamReader(miArchvo,codificacion);
					this.entrada = new BufferedReader(is);
				}catch(Exception e){
					throw new CantOpenFileException(archivo);
					//System.out.println("Class FileManager - Method cargarArchivo "+e.getMessage());
				}

	}
	
	/**
	 * Carga el archivo del path pasado como argumento y con codificación default UTF-8
	 * @param archivo
	 * @throws CantOpenFileException
	 */
	public void cargarArchivo(String archivo) throws CantOpenFileException{
		this.cargarArchivo(archivo, "");
	
	}
	
	public void setMarcadorComentario(char comentario){
		this.marcadorComentario = comentario;
	}
	
	public char getMarcadorComentario() {
		return this.marcadorComentario;
		
	}
	
	/**
	 * Devuelve la siguiente linea no nula como String
	 * En caso de que no haya más lineas arroja Exception
	 */
	public String obtenerSiguienteLinea() throws NoMoreLinesException{

		String linea="";
		try{

			//if((linea = entradaHtml.readLine())!= null){
			while((linea.trim().compareTo("")==0)&&((linea = entrada.readLine())!=null)){
				
				linea = linea.trim();
				if (linea.compareTo("")==0 || linea.charAt(0)==this.marcadorComentario){
						linea=this.obtenerSiguienteLinea();
				}
			}
			if (linea==null){
				entrada.close();
				//throw new NoMoreLinesException(getArchivo());
			}

		}catch(Exception e){					
					//System.out.println("Class FileManager - obtenerSiguienteLinea "+e.getMessage());
					//throw new NoMoreLinesException(getArchivo());
		}
		
		return linea;
		

	}

	public String getArchivo() {
		return archivo;
	}
	private void setArchivo(String archivo) {
		this.archivo = archivo;
	}
	
	/**
	 * Cierra el archivo abierto
	 *
	 */
	public void cerrarArchivo(){
		try {
			miArchvo.close();	
			is.close();			
			entrada.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Elimina el archivo pasado como parámetro
	 * 
	 * @param archivo
	 */
	public static void borrar(String archivo){
		File miArchivo = new File(archivo);
		if(miArchivo.exists())miArchivo.delete();
		
	}
	
	/**
	 * Escribe el texto pasado como parámetro al final del archivo cuyo path es pasado como parámetro
	 * @param arch
	 * @param texto
	 */
	public static void append(String arch,String texto){
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(arch, true));
			out.write(texto);
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		
		}

		
	}
	
	/**
	 * Copia un archivo a otro cuyos paths se pasan como parámetro
	 * 
	 * @param nombreFuente
	 * @param nombreDestino
	 * @throws IOException
	 */
	public static void copiar(String nombreFuente, String nombreDestino) throws IOException {
			FileInputStream fis = new FileInputStream(nombreFuente);
			FileOutputStream fos = new FileOutputStream(nombreDestino);
			FileChannel canalFuente = fis.getChannel();
			FileChannel canalDestino = fos.getChannel();
			canalFuente.transferTo(0, canalFuente.size(), canalDestino);
			fos.close();
			fis.close();
			canalDestino.close();
			canalFuente.close();
	} 
	
	


}